<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // promise 是一种延迟的状态不可逆的状态管理工具
        //          【 promise是一种具有延迟特性的可以通过状态控制分支语句特殊语法 】
        // promise 状态
        //      1. pedding    等待回调执行 ==> 等待promise的状态变化
        //      2. fulfilled  描述promiose运行时的定义一种特殊的成功状态 - 内置 resolve 函数的调用
        //                    ==> 当promise状态更新为 fulfilled 时，且此时该promise对象存在对应的回调方法，该方法会被执行
        //      3. rejected   描述promiose运行时的定义一种特殊的失败状态 - 内置 reject 函数的调用【在控制台输出错误】
        //                    ==> 当promise状态更新为 rejected 时，且此时该promise对象存在对应的回调方法，该方法会被执行
        // promise对象的原型then函数是不会在，代码读取时不会立即执行的，then的执行时机由promise对象的状态变化决定
        //                  then函数会返回一个全新的promise对象，而返回的promise对象的状态，由被执行的分支代码块执行结果决定
        //                          情况1：由执行代码控制（JS代码语法是否存在错误） ==> promise会吃掉错误
        //                          情况2：当执行代码正常，且存在非promise返回值或没有返回值,直接返回fulfilled状态promise对象
        //                          情况3：当执行代码正常，返回值为promise对象，then返回的promise对象就是方法内返回的promise对象
        // promise对象的原型 catch 函数，在promise链式调用**最后**，统一处理未被定义回调的 rejected 状态

        // 分支
        let flag;
        setTimeout(function () {
            flag = true;
        }, 3000)
        if (flag) {
            console.log("if 代码块")
        } else {
            console.log("else 代码块")
        }

        // promise
        let p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve(111)
                // reject()
            }, 3000)
        })
        // console.log(p);
        // console.log(p);
        // console.log(p);
        // console.log(p);
        // console.log(p);
        let p1 = p.then(
            function () {
                asdasda
                console.log("第一个 then 第一个函数的代码块")
                return Promise.resolve()
                // return Promise.reject()
            },
            // function () {
            //     console.log("第一个 then 第二个函数的代码块")
            // }
        )
        console.log("第一个then的返回值:",p1)

        let p2 = p1.then(
            function(){
                console.log("第二个 then 第一个函数的代码块")
            },
            // function(){
            //     console.log("第二个 then 第二个函数的代码块")
            // }
        )

        p2.catch(function(){
            console.log("catch 函数的代码块")
        })

        console.log("code end ============>")


        // 异步案例
        // var arr = [100,200,300,400,500];
        // let num = 1000;
        // for (let i in arr) {
        //     setTimeout(function(){
        //         console.log(arr[i])
        //     },num)
        //     num+=1000;
        // }
        // 异步案例
        // 1秒中后执行打印，打印完成在后重新开启一个新的计时器，在进行计时打印 ……
        // setTimeout(function () {
        //     console.log("第一个计时器")
        //     setTimeout(function () {
        //         console.log("第二个计时器")
        //         setTimeout(function () {
        //             console.log("第三个计时器")
        //             setTimeout(function () {
        //                 console.log("第四个计时器")
        //             }, 1000)
        //         }, 1000)
        //     }, 1000)
        // }, 1000)

    </script>
</head>

<body>

</body>

</html>